昨天看了兩種常用的儲存狀態的方式,今天來說明剩下幾種
ASP.NET Core 會在 Controller 中曝露 TempData
屬性。此屬性會保留資料直到資料被讀取,或者用 Keep
和 Peek
方法在讀取後保留資料。如果需要在請求重新導向後保留資料,TempData
是不錯的方法。TempData
是由 ITempDataProvider
的實作提供,目前 ASP.NET Core 框架中提供 Cookie 和 Session 的實作,預設是使用 Cookie,要使用 Session 除了在昨天範例中的設定外,還需要額外設定:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddSessionStateTempDataProvider();
}
使用 TempData
的方式跟使用 Dictionary<string, object>
的方式相同。
TempData["TempDate"] = DateTime.Now;
var tempDate = TempData["TempDate"];
利用 HTTP GET 或 POST 的方式保留並傳送資料,在需要持續使用狀態資料時很實用。因為用這種方式保留的資料是公開的形式,絕對不要用這種方式來保留敏感資料。除此之外也要注意 CSRF 的問題。
是一個 Dictionary<object,object>
物件,用來在單一個請求中儲存資料,在請求 pipeline 結束後清除。需要在不同中介層中傳遞資料時很實用。
如果要使用字串作為索引鍵,需要注意索引鍵重複的問題。要避免這個問題,可以用一個物件來做為索引鍵,參考官方文件的範例:
public class HttpContextItemsMiddleware
{
private readonly RequestDelegate _next;
public static readonly object HttpContextItemsMiddlewareKey = new Object();
public HttpContextItemsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
httpContext.Items[HttpContextItemsMiddlewareKey] = "Stored Value in Middleware";
await _next(httpContext);
}
}
public static class HttpContextItemsMiddlewareExtensions
{
public static IApplicationBuilder
UseHttpContextItemsMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<HttpContextItemsMiddleware>();
}
}
篇幅太多了,明天再談XD
把包含資料的服務加入服務容器:
public class StatesInjection
{
public string InjectedState { get; set; }
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new StatesInjection {InjectedState = "Injected State"});
}
}
public class ApplicationStatesController : Controller
{
private readonly StatesInjection _injection;
public ApplicationStatesController(StatesInjection injection)
{
_injection = injection;
}
}